home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 49
/
Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso
/
-in_the_mag-
/
banging_the_metal
/
clocks
/
settime
/
settime.asm
< prev
next >
Wrap
Assembly Source File
|
1999-11-30
|
11KB
|
345 lines
*******************************************************************************
* *
* Settime V0.9 © 1991 by Acki *
* *
* This useful utility takes the time from the internal hardware clock and *
* sets it as the System-time. No Workbench-usage !!. The clock is supposed *
* to be at $dc0000; no clock in this area and running settime will result *
* in an invalid System-time. I wrote this programm because I wanted a really *
* fast and small timeset-utility different from Commodores Setclock which *
* always takes such a long loading time. *
* Use it at your own risk !!! I didn't test it extensively, so there still *
* might be bugs. If you figure out one, please let me know !!!. It worked *
* quite smoothly from 29-aug to 30-sep. *
* *
* This directory contains the executable and the same thing as a *bootblock*! *
* Settime.bbl is the custom-bootblock as it is used by BBChampion and many *
* other utilities; Settime.zv is the same thing in Zerovirus-Format (I used *
* the Version on Fish 412). *
* Each Bootblock is complete (Checksum,Bootcode etc.), simply load it with *
* your favourite Virushunter or Bootblocktool (Zerovirus, BootBlockChampion *
* etc.) and save it on your startup-disk. *
* Whenever a disk containing this bootblock is booted up, the screen will *
* turn black and show green stripes for a moment to indicate that you *
* have installed Settime. *
* *
* *
* If you reassemble the file like it is, you'll get the Cli-Version. *
* To get a bootblock, simply remove the ';' at each line and act as if you *
* wanted to get a normal, runable programm. Then take BootBlockChampion III, *
* select 'Load Bootblock' ,choose 'Bootblock Code' and load your *
* 'executable'. Select 'Ok' and the Bootblock will be installed on your Disk. *
* *
* Are you interested in writing Custom-Bootblocks yourself ? *
* On Fish 242 there is a detailed description how it works and what you *
* should take care of ! *
* *
* This Programm is FREEWARE. Use it at your own risk etc. !!! *
* If you want to release it with your Anti-virus-utility or BootblockTool *
* as Custom-Bootblock, please let me know !!! *
* *
* All this stuff was written using the Devpac V2.14 Assembler, Kickstart 1.2 *
* *
* Thanks in advance for your comments ! *
* *
* Andreas Ackermann *
* Lorenz-Summa-Str. 10 *
* W-8679 Oberkotzau *
* Germany *
* Phone: 09286/6399 *
* *
* 03-Oct-91 10:24:14 * *
* *
*******************************************************************************
rsreset
ln rs.b 0
ln_succ rs.l 1
ln_pred rs.l 1
ln_type rs.b 1
ln_pri rs.b 1
ln_name rs.l 1
ln_size rs.l 0
nt_msgport equ 4
nt_message equ 5
rsreset
mp rs.b ln_size
mp_flags rs.b 1
mp_sigbit rs.b 1
mp_sigtask rs.l 1
mp_msglist rs.b 14
rsreset
mn rs.b ln_size
mn_replyport rs.l 1
mn_length rs.w 1
mn_size rs.w 0
rsreset
iostdrequest rs.l 0
io_message rs.b mn_size
io_device rs.l 1
io_unit rs.l 1
io_command rs.w 1
io_flags rs.b 1
io_error rs.b 1
io_size rs.l 0
io_actual rs.l 1
io_length rs.l 1
io_data rs.l 1
io_offest rs.l 1
iostd_size rs.l 0
rsreset
td rs.l 0
td_io rs.b io_size
tv_secs rs.l 1
tv_micro rs.l 1
include "exec/exec_lib.i"
;anfang move.l 4.w,a6 ;standard routine at the beginning
; lea.l dosname(pc),a1 ;of each bootblock
; jsr -$60(A6)
; move.l d0,a0
; move.l $16(a0),a0
; bsr _main
; moveq #0,d0
; rts
;dosname dc.b 'dos.library',0
; even
_main
movem.l d0-7/a0-6,-(sp)
; moveq #$ff,d0 ; that's all to get the gfx
;alert add.w #$111,$dff180 ; when we boot up !
; dbf d0,alert
moveq #1,d2
moveq #0,d1
lea devname(pc),a0
moveq #60,d0
bsr open_a_device ;open timer.device
move.l d0,d7
move.l d0,a1
move.w #11,io_command(a1)
;command: setsystime
move.l #$dc0000,a0 ;format: number of seconds since
moveq #$28,d1 ;1-jan-78
bsr getdez ;number of years
move.w d0,d3
4$
sub.w #78,d0
move.w d0,d1
addq #1,d1
lsr.w #2,d1
2$ add.l #60*60*24,d2
dbf d1,2$
sub.l #60*60*24,d2
1$ add.l #$1e13380,d2
dbf d0,1$
sub.l #$1e13380,d2
moveq #$20,d1
bsr getdez ;actual month
lea monthtable(pc),a1
move.l #60*60*24*28,8(a1)
btst.l #0,d3
bne.s 3$
btst.l #1,d3
bne.s 3$ ;is actual year a leap-year ?
add.l #60*60*24,8(a1) ;feb->29 days !
3$ moveq #$0,d1
7$ add.l (a1)+,d2
addq #1,d1
cmp.b d0,d1
bne.s 7$
moveq #$18,d1
bsr getdez
5$ add.l #60*60*24,d2
dbf d0,5$
sub.l #60*60*24*2,d2
moveq #$10,d1
bsr getdez ;actual hour
mulu #60*60,d0
add.l d0,d2
moveq #$8,d1
bsr getdez ;actual minute
mulu #60,d0
add.l d0,d2
moveq #0,d1
bsr getdez ;actual second
add.l d0,d2
bra.s endskip
getdez
move.l 4(a0,d1.w),d0 ;here we read the hardware clock. Every entry
and.l #%1111,d0 ;(year,month,etc.) consists of two 32-bit
mulu.w #10,d0 ;registers the first one containing the 2nd
move.l 0(a0,d1.w),d1 ;digit and the 2nd one containing the 1st digit
and.l #%1111,d1 ;(decimal system !!!)
add.b d1,d0 ;result -> d0.l
rts
monthtable
tg31 equ 60*60*24*31
tg30 equ 60*60*24*30
tg28 equ 60*60*24*28
dc.l 0,tg31,tg28,tg31,tg30,tg31,tg30,tg31,tg31,tg30,tg31,tg30
endskip
move.l d7,a1
move.l d2,tv_secs(a1)
jsr _lvodoio(a6) ;now really set the time
moveq #60,d0
bsr close_a_device ;clean_up
movem.l (sp)+,d0-7/a0-6
rts
devname
dc.b 'timer.device',0
even
;d0=length
;a0=devname
;d2=unit
;d1=flags
;result=d0 0->error ,else pointer to messageport
open_a_device
movem.l d4-d7,-(sp)
move.l a0,d4
move.l d1,d5
move.l d0,d6
move.l 4.w,a6
move.l #$10000,d1
add.l #34,d0
jsr _lvoallocmem(a6)
move.l d0,d7
beq od_nomsgmem
move.l d0,a0
moveq #0,d0
sub.l a1,a1
bsr createport
tst.l d0
beq od_noport
add.l #34,d7
move.l d7,a1
move.l a0,mn_replyport(a1)
move.w d6,mn_length(a1)
move.b #nt_message,ln_type(a1)
move.l d2,d0
move.l d4,a0
move.l d5,d1
jsr _lvoopendevice(a6)
tst.l d0
beq.s od_ok
od_error
move.l d7,a0
sub.l #34,d7
bsr deleteport
od_nomsgmem
moveq #0,d7
od_ok
move.l d7,d0
movem.l (sp)+,d4-7
rts
od_noport
move.l d7,a1
sub.l #34,a1
move.l d6,d0
add.l #34,d0
jsr _lvofreemem(a6)
bra.s od_nomsgmem
;a1=msgport
;d0=length
close_a_device
move.l 4.w,a6
movem.l d0/a1,-(sp)
jsr _lvoclosedevice(a6)
movem.l (sp)+,d0/a1
move.l mn_replyport(a1),a0
bsr deleteport
sub.l #34,a1
add.l #34,d0
jsr _lvofreemem(a6)
rts
;a0=^to messageport
;d0= pri
;a1=^to name
;this function won't create a public message-port (cause we don't addport
;our port !)
createport
move.l 4.w,a6
move.b d0,ln_pri(a0)
move.l a1,ln_name(a0)
move.b #nt_msgport,ln_type(a0)
move.l a0,-(sp)
moveq #$ff,d0
jsr _lvoallocsignal(a6)
move.l (sp),a0
move.b d0,mp_sigbit(a0)
addq #1,d0
beq.s cp_error
sub.l a1,a1
jsr _lvofindtask(a6)
move.l (sp)+,a0
move.l d0,mp_sigtask(a0)
moveq #$ff,d0
rts
cp_error
move.l (sp)+,a0
moveq #0,d0
rts
;a0=port
deleteport
movem.l d0/a1,-(sp)
move.l 4.w,a6
move.b #$ff,ln_type(a0)
moveq #0,d0
move.b mp_sigbit(a0),d0
jsr _lvofreesignal(a6)
movem.l (sp)+,d0/a1
rts
dc.b 'This programm sets the system-time from your internal clock.'
dc.b ' First published on the Fred-Fish collection >540 !!! '
dc.b ' Author: Andreas Ackermann, Lorenz-Summa-Str. 10, W-8679 '
dc.b ' Oberkotzau Germany Phone: 09286/6399 ',0,0
END
*******************************************************************************
* *
* Enjoy !!! Another masterpiece of ACKI *
* *
*******************************************************************************